<?php

class AppModel extends Model {

    var $actsAs = array('Containable');

    /**
     * แปลง string วันที่ วัน/เดือน/ปี เป็น ปี/เดือน/วัน ในฐานข้อมูล
     * @param <type> $dateString
     * @return <type>
     */
    function dateFormatBeforeSave($dateString) {
        $date = explode('/', $dateString);

        // ถ้าส่งข้อมูลเข้ามาถูกต้อง return date
        if (isset($date[2])) {
            return "{$date[2]}-${date[1]}-{$date[0]}";
        } else {
            return null;
        }
        //return date('Y-m-d', strtotime($dateString));
    }

    function dateFormatAfterFind($field) {
        if (!empty($field)) {
            return date('d/m/Y', strtotime($field));
        } else {
            return null;
        }
    }

    /**
     * แปลง string วันที่ วัน/เดือน/ปี และ เวลา (ถ้ามี) เป็น ปี/เดือน/วัน ในฐานข้อมูล
     * @param $model ที่เก็บ field วันที่และเวลา ต้องมี field ดังนี้ $model[$field . '_date'], $model[$field . '_time'][hour], $model[$field . '_time'][min]
     * @return <type>
     */
    function dateTimeFormatBeforeSave(&$model, $field) {
        $date = explode('/', $model[$field . '_date']);

        if (!empty($date[2])) {
            // ถ้ามี ข้อมูลใน time นี้
            if (!empty($model[$field . '_time'])) {

                $hour = $model[$field . '_time']['hour'];
                $min = $model[$field . '_time']['min'];
                if ($hour == null) {
                    $hour = '00';
                }
                if ($min == null) {
                    $min = '00';
                }

                // ถ้าส่งข้อมูลเข้ามาถูกต้อง return date
                if (isset($date[2])) {
                    // Y-m-d H:m:s
                    $model[$field . '_date'] = "{$date[2]}-{$date[1]}-{$date[0]} {$hour}:{$min}:00";
                }
            } else {
                $model[$field . '_date'] = "{$date[2]}-{$date[1]}-{$date[0]} 00:00:00";
            }
        } else {
            $model[$field . '_date'] = null;
        }
    }

    /**
     * จัดรูปแบบการ แสดงผลวัน/เวลา ถ้าเป็นวันนี้แสดงเฉพาะ เวลา
     * วันอื่น ๆ แสดง วัน/เวลา
     * @param <type> $dateString
     * @return <type>
     */
    function datetimeFormatAfterFind($dateString, $shortToday = true) {
        $date = date('d/m/Y', strtotime($dateString));
        // today
        if ($shortToday && date('H', strtotime($dateString)) == '00' && date('i', strtotime($dateString)) == '00') {
            return date('d/m/Y', strtotime($dateString));
        } else {
            return date('d/m/Y G:i:s', strtotime($dateString));
        }
    }

    /**
     * แปลง table prefix (คำว่า pre) มาเป็น table prefix จริง ๆ ที่ใช้อยู่
     * @param string$sql
     */
    function query($sql) {
        $sql = str_replace('pre_', $this->tablePrefix, $sql);
        return parent::query($sql);
    }

    /**
     * Check ว่าถ้าใน data ที่ส่งมามี value ที่ data[$model][$field]
     * return sql condition ที่เพิ่มเข้ามา โดย
     * operator
     * ถ้า field ลงท้ายด้วย id     =
     * ลงท้ายด้วย date           BETWEEN ... AND ...
     * อื่น ๆ                     LIKE "%UPPER CASE VALUE%"
     * @param <type> $data
     * @param <type> $model
     * @param <type> $field
     * @return <type>
     */
    public function addSqlConditions($data) {
        $sql = "";

        // วนลูป data แต่ละตัว
        foreach ($data as $model => $row) {
            if ($model != 'Option' && is_array($row)) {
                foreach ($row as $field => $value) {
                    // ถ้าไม่ใช่ model option ให้ add sql condition เพิ่ม
                    $sql .= $this->_addSqlCondition($data, $model, $field, $value);
                }
            }
        }

        return $sql;
    }

    /**
     * Check ว่าถ้าใน data ที่ส่งมามี value ที่ data[$model][$field]
     * return sql condition ที่เพิ่มเข้ามา โดย
     * operator
     * ถ้า field ลงท้ายด้วย id     =
     * ลงท้ายด้วย date           BETWEEN ... AND ...
     * อื่น ๆ                     LIKE "%UPPER CASE VALUE%"
     * @param <type> $data
     * @param <type> $model
     * @param <type> $field
     * @return <type>
     */
    public function _addSqlCondition($data, $model, $field, $value) {
        $sql = "";
        if (!empty($data[$model][$field])) {

            if (endsWith($field, '_id')) {
                $sql = " AND {$model}.{$field} = '{$value}' ";
            } elseif (strpos($field, '_start') > 0) {
                $field = str_replace('_start', '', $field);
                $start = $data[$model][$field . '_start'];
                $end = $data[$model][$field . '_end'];
                $sql = " AND {$model}.{$field} BETWEEN '{$start}' AND '{$end}'";
            } elseif (strpos($field, '_end') > 0) {
                // เจอ _end ไม่ต้องทำอะไร
            } else {
                $sql = " AND {$model}.{$field} LIKE '%{$value}%' ";
            }
        }
        return $sql;
    }
}

?>